Skip to content

02 控制流

程序不能只是从上到下执行一遍就结束,你需要根据条件做不同的事情,需要重复执行某些操作。if做条件判断,forwhile做循环,match做模式匹配——这三个是Python控制流的核心。

一、if语句

1.1 基本语法

python
>>> x = int(input("请输入一个整数: "))
请输入一个整数: 42
>>> if x < 0:
...     x = 0
...     print('负数变为零')
... elif x == 0:
...     print('零')
... elif x == 1:
...     print('一')
... else:
...     print('更多')
更多

elifelse if的缩写。if...elif...elif...可以串很多个,最后的else可选。

1.2 条件表达式

Python没有switch语句(3.10之前),用if...elif...else替代。条件不需要括号,但语句末尾的冒号不能少。

二、for循环

2.1 遍历序列

Python的for循环和C语言不同,它不自己管理索引,而是直接遍历序列里的元素:

python
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12

2.2 遍历时修改列表

遍历列表时如果要修改列表本身(比如删除元素),不要直接遍历原列表,先复制一份:

python
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words[:]:   # 遍历副本
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']

直接遍历words并修改它,结果是不可预测的。

三、range()函数

3.1 基本用法

需要遍历一个数字序列时,用range()

python
>>> for i in range(5):
...     print(i)
...
0
1
2
3
4

3.2 指定起止和步长

python
>>> for i in range(5, 10):
...     print(i)
...
5
6
7
8
9

>>> for i in range(0, 10, 3):
...     print(i)
...
0
3
6
9

>>> for i in range(-10, -100, -30):
...     print(i)
...
-10
-40
-70

range(start, end, step)——起始值(默认0)、结束值(不含)、步长(默认1)。

3.3 配合len()遍历索引

python
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb

不过大多数时候用enumerate()更优雅。

3.4 range转列表

python
>>> list(range(5))
[0, 1, 2, 3, 4]

四、break、continue和else

4.1 break和continue

break跳出循环,continue跳过当前迭代:

python
>>> for n in range(2, 10):
...     if n % 2 == 0:
...         print(f"发现偶数: {n}")
...         continue
...     print(f"发现奇数: {n}")
发现偶数: 2
发现奇数: 3
发现偶数: 4
发现奇数: 5
发现偶数: 6
发现奇数: 7
发现偶数: 8
发现奇数: 9

4.2 循环的else子句

forwhile循环可以有else子句,当循环正常结束(没被break中断)时执行:

python
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, '等于', x, '*', n//x)
...             break
...     else:
...         # 循环正常结束,说明没找到因子
...         print(n, '是质数')
...
2 是质数
3 是质数
4 等于 2 * 2
5 是质数
6 等于 2 * 3
7 是质数
8 等于 2 * 4
9 等于 3 * 3

如果被break中断,else不会执行。

五、while循环

5.1 基本用法

python
>>> a, b = 0, 1
>>> while a < 10:
...     print(a, end=' ')
...     a, b = b, a+b
...
0 1 1 2 3 5 8

5.2 死循环

python
>>> while True:
...     response = input('输入quit退出: ')
...     if response == 'quit':
...         break
...
输入quit退出: hello
输入quit退出: quit

六、pass语句

pass什么都不做,用于语法上需要语句但逻辑上不需要做任何事的场合:

python
>>> while True:
...     pass   # 忙等待,按Ctrl+C退出

>>> class MyEmptyClass:
...     pass

>>> def init_log():
...     pass   # 还没实现,先占位

七、match语句(3.10+)

7.1 基本匹配

python
>>> status = 404
>>> match status:
...     case 200:
...         print("OK")
...     case 404:
...         print("Not Found")
...     case 500:
...         print("Server Error")
...     case _:
...         print("Unknown")
...
Not Found

_是通配符,匹配任何值。

7.2 解构匹配

python
>>> point = (1, 0)
>>> match point:
...     case (0, 0):
...         print("原点")
...     case (x, 0):
...         print(f"X轴上,x={x}")
...     case (0, y):
...         print(f"Y轴上,y={y}")
...     case (x, y):
...         print(f"点({x}, {y})")
...
X轴上,x=1

7.3 匹配字典

python
>>> action = {"type": "move", "x": 10, "y": 20}
>>> match action:
...     case {"type": "move", "x": x, "y": y}:
...         print(f"移动到({x}, {y})")
...     case {"type": "click", "target": target}:
...         print(f"点击{target}")
...
移动到(10, 20)

7.4 守卫条件

python
>>> point = (1, 1)
>>> match point:
...     case (x, y) if x == y:
...         print(f"在对角线上,x=y={x}")
...     case (x, y):
...         print(f"点({x}, {y})")
...
在对角线上,x=y=1

if后面是守卫条件,只有模式匹配且条件为真时才进入该分支。

八、总结

语句用途
if/elif/else条件判断
for遍历序列
while条件循环
range()生成数字序列
break跳出循环
continue跳过当前迭代
else(循环)循环正常结束时执行
pass占位符
match/case模式匹配(3.10+)

for循环直接遍历元素,不需要手动管理索引。range()生成数字序列。循环的else子句在没被break中断时执行。match是3.10新增的,支持解构和守卫条件。